<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 实现栈
    // 定义一个Stack类
    function Stack(){
      var items = [] // 使用数组存储数据
      //栈有以下几方法
      //1. push  添加一个元素到栈顶，(向桶里面放入一个羽毛球)
      this.push = function(item){
        items.push(item)
      }

      //2. pop 弹出栈顶元素 ，（从桶中拿出一个羽毛球）
      this.pop = function (){
        return items.pop()  // 数组的pop方法会删除数组的最后一个元素，同时return 改元素
      }

      // 3. top 方法找回栈顶元素
      // top方法只想查看下最顶端的元素
      this.top=function(){
        return items[items.length-1]
      }

      // 4. isEmpty  返回栈是否为空
      this.isEmpty = function (){
        return items.length==0
      }

      // 5. size  返回栈的大小
      this.size = function (){
        return items.length
      }

      // 6. clear  清空栈
      this.clear = function (){
        items = []
      }
    }

    // is_leagl_brackets  判断一个字符串中的左右括号是否成对出现
    function is_leagl_brackets(string){
      var stack = new Stack()
      for (let i = 0; i < string.length; i++) {
        const item = string[i];
        if(item==="("){
          stack.push(item)
        }else if(item===")"){
          // 如果为空，就说明没有左括号与之抵消
          if(stack.isEmpty()){
            return false
          }else{
            // 如果不为空，就从栈顶弹出一个左括号，与之当前右括号抵消
            stack.pop()
          }
        }
      }
      return stack.size()===0
    }


   
    // function is_leagl_brackets2(string){
    //   var obj = {
    //     left:"",
    //     right:''
    //   }
    //   for (let i = 0; i < string.length; i++) {
    //     const item = string[i];
    //     if(item==="("){
    //       if(!obj.left){

    //       }
    //     }else if(item===")"){

    //     }
    //   }
    // }
  //  console.log(is_leagl_brackets("((sdf jkl (sdfjsdlk)))"))
 

  function calc_exp(exp){
      var stack = new Stack()
      for (let i = 0; i < exp.length; i++) {
        const item = exp[i];
        if(['+','-','*','/'].indexOf(item)>=0){
          // 取出栈中的两个
          var value1 = stack.pop()
          var value2 = stack.pop()
          // 拼接成表达式
          const exp_str = value1+item+value2
          // 执行表达式并取整
          const res = parseInt(eval(exp_str))
          // 将计算结果压住栈中
          stack.push(res.toString())
        }else{
          stack.push(item)
        }
      }
      //返回栈中 最后保留个的一个结果 恰好就是最后的表达式计算结果
      return stack.pop()
    }

    console.log(calc_exp(['2','3',"+",'9',"*"]))   // 45
  </script>
</body>
</html>